<?

/**
 * Novedades class
 *
 * Esta clase maneja las entradas de novedades
 * @author Nicolas Munoz <nicolas.munoz@elserver.com>
 * @version 1.0
*/
class Novedades extends Core {

	static protected $instancia;
	static protected $opciones = array(
		'rpp' => 5, // Resultados por pagina 
		'filtros' => array(), // Filtros para la funcion listar
		'page' => 1, // Numero de pagina por defecto
		'order' => 'n.id_novedad', // Ordenamiento de listar()
		'order_type' => 'DESC' // Tipo de ordenamiento (ASC/DESC)
	);
	static protected $permitidos = array('titulo', 'texto', 'id_area', 'publico');
	private $count = 0;
	private $paginas = 0;

	/**
	 * Constructor de la clase.
	 * 
	 * @param array $opciones (opcional) Opciones validas para esta clase
	 */
	function __construct ($opciones=null) {
		// Llamo al constructor del parent tambien
		parent::__construct();
		// Guardo las opciones si me definio alguna
		if ($opciones)
			$this->opciones($opciones);
	}

	/**
	 * Setea las opciones 
	 * 
	 * @param array $opciones (opcional) Opciones validas para esta clase. Si esta vacio, funciona como un getter.
	 * @return array $opciones Listado de opciones
	 */
	public function opciones ($opciones=null) {
		return self::$opciones = parent::opciones(self::$opciones, $opciones);
	}

	/**
	 * Devuelve una unica instancia de esta clase
	 * 
	 * @return object Instancia de esta clase
	 */
	public static function getInstance() {
		if (!self::$instancia instanceof self)
			self::$instancia = new self;
		return self::$instancia;
	}

	/**
	 * Agrega una novedad a la base
	 * 
	 * @param array $faq La informacion para la novedad, ej: ('titulo' => '...', 'texto' => '...', 'id_area' => 1, 'publico' => 1)
	 * @return integer El id de la novedad
	 */
	public function agregar ($novedad) {

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo un objeto sesion
		$Session = ($this)? $this->Session : Session::getInstance();

		// Obtengo el objeto de acl
		$acl = new ACL($Session->get('usuario.id'));

		// Solo dejo los campos permitidos para agregar
		$permitidos = self::$permitidos;
		$_novedad = array();
		foreach ($permitidos as $p)
			if ($novedad[$p])
				$_novedad[$p] = $novedad[$p];

		// Chequeo si tiene permisos para agregar

		// Almaceno el usuario creador
		$_novedad['id_usuario'] = $Session->get('usuario.id');
		
		// Creo el faq
		$id_novedad = $db->insert('novedades', $_novedad);

		return $id_novedad;
	}

	/**
	 * Marca una novedad como eliminada
	 * 
	 * @param integer $id_novedad El id de la novedad a eliminar
	 * @return boolean
	 */
	public function eliminar ($id_novedad) {

		// Saneamiento de variables
		$id_novedad = addslashes($id_novedad);

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo un objeto sesion
		$Session = ($this)? $this->Session : Session::getInstance();

		// Actualizo el registro
		$db->query("UPDATE novedades SET eliminado = 1 WHERE id_novedad = '$id_novedad' LIMIT 1");

		return true;
	}

	/**
	 * Modifica una novedad
	 * 
	 * @param integer $id_novedad El id de la novedad a modificar
	 * @param array $novedad La nueva informacion de la novedad
	 * @return boolean
	 */
	public function modificar ($id_novedad, $novedad) {

		// Saneamiento de variables
		$id_novedad = addslashes($id_novedad);

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Obtengo un objeto sesion
		$Session = ($this)? $this->Session : Session::getInstance();

		// Obtengo el objeto de acl
		$acl = new ACL($Session->get('usuario.id'));

		// Solo dejo los campos permitidos para modificacion
		$permitidos = self::$permitidos;
		$_novedad = array();
		foreach ($permitidos as $p)
			if ($novedad[$p])
				$_novedad[$p] = $novedad[$p];

		// Actualizo el registro
		$db->update('novedades', array_merge(array('id_novedad' => $id_novedad), $_novedad));

		return true;
	}

	/**
	 * Lista las novedades de acuerdo a los parametros recibidos
	 * 
	 * @param array $opciones (Opcional) Opciones validas para esta clase.
	 * @return array
	 */
	public function listar ($opciones=null) {

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Seteo las opciones
		$opciones = ($this instanceof self)? $this->opciones($opciones) : self::opciones($opciones);
		
		
		// Limite de dias
		if ($opciones['filtros']['dias']) {
			$and .= ' AND DATEDIFF(NOW(), ctime) < ' . $opciones['filtros']['dias'];
			unset($opciones['filtros']['dias']);
		}		
		
		
		// Agrego los filtros
		$join = array();
		if (is_array($opciones['filtros']))
			foreach ($opciones['filtros'] as $filtro) {
				$and .= " AND " . $filtro;
			}
		

		
		// Query base
		$query = "SELECT SQL_CALC_FOUND_ROWS *
					FROM novedades n
					WHERE 1=1 $and
					AND n.eliminado = 0
					GROUP BY n.id_novedad
					ORDER BY " . $opciones['order'] . " " . $opciones['order_type'] . " 
					LIMIT " . (($opciones['page']-1) * $opciones['rpp']) . ", " . $opciones['rpp'];
					
		$novedades = $db->get_results($query);
		
		//$db->debug();
		
		// Agrupo por fecha de publicacion
		foreach ($novedades as $key_novedad => $value_novedad) {
			$fecha = explode(' ', $novedades[$key_novedad]['ctime']);
			$listado['data'][current($fecha)][] = $novedades[$key_novedad];
		}
		
		// Agrego cantidad de paginas y resultados
		$listado['resultados'] = (int)$db->get_var('SELECT FOUND_ROWS()');
		$listado['paginas'] = ceil($listado['resultados'] / $opciones['rpp']);
		
		return $listado;
	}

	/**
	 * Devuelve los datos de una novedad
	 * 
	 * @param integer $id El ID de la novedad
	 * @return array Datos de la novedad
	 */
	public function get ($id_novedad) {

		// Obtengo el objeto de base de datos
		$db = ($this)? $this->db : ez_sql::getInstance();

		// Seteo las opciones
		$opciones = ($this instanceof self)? $this->opciones($opciones) : self::opciones($opciones);

		// Query base
		$novedad = $db->get_row("SELECT * FROM novedades WHERE id_novedad = $id_novedad LIMIT 1");
		
		return $novedad;
	}

}

?>
